package wodegua.d31_java高级.d2_reflect;

import java.lang.reflect.Field;

/**
 * 获取类的成员变量
 * Class提供了从类中获取成员变量的方法
 * 方法
 * public Field[] getFields()    获取类的全部成员变量(只能获取public修饰的)
 * public Field[] getDeclaredFields()    获取类的全部成员变量(只要存在就能拿到)
 * public Field getField(string name)   获取类的某个成员变量(只能获取public修饰的)
 * public Field getDeclaredField(string name)   获取类的某个成员变量(只要存在就能拿到)
 *
 * 获取到成员变量的作用:依然是赋值、取值。
 * 方法
 * void set(object obj,object value):   赋值
 * object get(object obj)   取值
 * public void setAccessible(boolean flag)   设置为true，表示禁止检查访问控制(暴力反射)
 */
public class Test3Field {
    public static void main(String[] args) throws Exception {
        Class c = Student.class;
        Field[] f = c.getFields();
        for (Field field : f) {
            System.out.println(field.getName() + "--->" + field.getType());
        }
        System.out.println("----------------------");
        Field[] f2 = c.getDeclaredFields();
        for (Field field : f2) {
            System.out.println(field.getName() + "--->" + field.getType());
        }
        System.out.println("----------------------");
        Field f3 = c.getField("number");
        System.out.println(f3.getName() + "--->" + f3.getType());
        System.out.println("----------------------");
        Field f4 = c.getDeclaredField("name");
        System.out.println(f4.getName() + "--->" + f4.getType());

        System.out.println("----------------------");
        Student student = new Student();
        f4.setAccessible(true);
        f4.set(student, "张三");
        System.out.println(student.getName());
        System.out.println(f4.get(student));
    }
}
